<?php

namespace app\api\controller;

use app\BaseController;
use think\facade\Db; // 数据库的链接


class Mining extends BaseController
{
    // 获取矿机的列表
    public function getMiningList()
    {
        $sql[] = ['del','=',0];
        $miningList = Db::name('mining')->where($sql)->select()->toArray();
        return json(['code' => 200,'msg' => '获取成功', 'data' => $miningList]);
    }
    // 获取矿机的使用记录
    public function getMiningRecord()
    {
        $post = input();
        $UID = request()->UID;
        $type = @$post['type']; // 0收益 1结束
        $page = @$post['page']? $post['page'] : 1;
        $limit = @$post['limit']? $post['limit'] : 10;
        $where = [];

        if($type == 0){
            $where[] = ['del','=', 0];
        }else{
            $where[] = ['del','=', 1];
        }

        // 获取矿机的使用记录
        $miningRecord = Db::name('user_mining')
            ->field("*,FROM_UNIXTIME(obtain_time,'%Y-%m-%d %H:%i:%s') as obtain_time,FROM_UNIXTIME(profit_time,'%Y-%m-%d %H:%i:%s') as profit_time")
            ->where($where)
            ->where('UID', $UID)
            ->order('obtain_time desc')
            ->paginate([
                'list_rows' => $limit,
                'page' => $page
            ])
            ->toArray();
        
        // 返回

        return json(['code' => 200,'msg' => '获取成功', 'data' => $miningRecord]);
    }
    // 矿机的购买
    public function buyMining()
    {
        $post = input();
        $UID = request()->UID;
        $mining_id = @$post['mid'];
        $num = 1; // 默认购买数量为1

        // 判断矿机是否存在
        $mining = Db::name('mining')->where('id', $mining_id)->find();
        if(!$mining){
            return json(['code' =>500,'msg' => '任务包不存在']);
        }

        // 判断用户是否有足够的钱购买
        $user = Db::name('user')->where('id', $UID)->find();
        if($user['gold'] < $mining['price'] * $num){
            return json(['code' =>500,'msg' => '金牌不足']);
        }

        // 查询用户的矿机数量

        $user_mining = Db::name('user_mining')->where('uid', $UID)->where('mid', $mining_id)->where('del', 0)->count();
        if($user_mining >= $mining['most']){
            return json(['code' =>500,'msg' => '当前档次任务包数量已达上限']);
        }

        // 开启事务
        Db::startTrans();
        try{

        // 扣除用户的金牌
        userRecord($UID, $mining['price'] * $num, 1,1, '购买任务包:'. $mining['name']. ' x '. $num);
            
        // 增加用户的矿机
        $res2 = Db::name('user_mining')->insert([
            'uid' => $UID,
            'mid' => $mining_id,
            'profit_day' => 0,
            'obtain_time' => time(),
            'total_revenue' => 0
        ]);

        if(!$res2){

            // 回滚事务
            Db::rollback();

            return json(['code' => 200,'msg' => '购买成功']);
        }

 
        // 提交事务
        Db::commit();

        return json(['code' => 200,'msg' => '购买成功']);

        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return json(['code' => 500,'msg' => '购买失败']);
        }
    }
    // 矿机的收益 点击领取方式  // 资金收益
    public function getMiningProfit()
    {
        $post = input();
        $UID = request()->UID;
        $mining_id = @$post['mid'];

        // 判断矿机是否存在
        $user_mining = Db::name('user_mining')->where('uid', $UID)->where('mid', $mining_id)->where('del', 0)->select()->toArray();
        if(!$user_mining){
            return json(['code' =>500,'msg' => '没有该任务包']);
        }

        // 查询收益时间小于今日的时间
        $today = strtotime(date('Y-m-d'));
        $user_mining = Db::name('user_mining')->where('uid', $UID)->where('mid', $mining_id)->where('profit_time', '<', $today)->where('del', 0)->select()->toArray();
        if(!$user_mining){
            return json(['code' =>500,'msg' => '今日没有可以领取收益的任务包']);
        }

        // 开启事务
        Db::startTrans();
        try{


        foreach ($user_mining as $key => $value) {
            // 上次收益时间距离今日的时间 相差多少天
            // --- 如果profit_time == 0 则说明是第一次领取奖励
            if($value['profit_time'] == 0){
                // 就按获得时间来算
                $days = ceil((time() - $value['obtain_time']) / 86400); // 得到奖励天数 就不减1了
            }else{
                $days = ceil((time() - $value['profit_time']) / 86400) - 1; // 得到奖励天数 因为领取过所有要减1
            }
            $data = [];
            // 查询任务包的消息
            $mining = Db::name('mining')->where('id', $value['mid'])->find();
            // 有多少天没有领取奖励 + 已经领取的奖励天数 小于等于时长 则领取奖励
            if($days + $value['profit_day'] <= $mining['duration']){
                // 奖励金牌
                $profit = $mining['profit'] * $days;
                $data['profit_day'] = $value['profit_day'] + $days;
                $data['total_revenue'] = $value['total_revenue'] + $profit;
            }else{
                // 最大领取天数 - 已经领取的奖励天数
                $max_day = $mining['duration'] - $value['profit_day'];
                // 奖励金牌
                $profit = $mining['profit'] * $max_day;
                
                $data['profit_day'] = $mining['duration'];
                $data['total_revenue'] = $value['total_revenue'] + $profit;

            }
            $data['profit_time'] = time();

            if($data['profit_day'] == $mining['duration']) {
                $data['del'] = 1;
            }

            // 在更新用户任务包的数据记录
            Db::name('user_mining')->where('id', $value['id'])->update($data);

            // 给上级分销 给直推 间推 团队奖励 参数分别 当前用户ID 数量 类型 (0银牌 1金牌) 文字描述
            getMiningProfitByParent($UID,$profit,1,'任务包');
            // 增加用户金牌
            userRecord($UID, $profit, 1, 0, '任务包数据ID:'.$value['id'].' 领取奖励:'. $profit. '金牌, 奖励天数:'.$days > $mining['duration'] ? $mining['duration'] : $days);    
        }

        // 提交事务
        Db::commit();

        return json(['code' => 200,'msg' => '奖励领取成功']);
        } catch (\Exception $e) {
            // 回滚事务
            Db::rollback();
            return json(['code' => 500,'msg' => '奖励领取失败']);
        }
    }
    /**
     * 矿机的收益 的上级分销
     * @param $uid  当前用户id
     * @param $profit  奖励金牌数
     * @param $type  奖励类型 0银牌 1金牌
     * @return void
     */
    public function getMiningProfitByParent($uid,$profit,$type)
    {
        // $uid = 27;
        // $profit = 100;

        // 查询上级
        $sid = Db::name('user')->where('id',$uid)->value('sid');
        
        if(!$sid || $sid == 0){
            return;
        }
        
        $i = 1;// uid用户的第几个上级

        // 获取配置信息
        $config = getSetting('config');
        $tuan = $config['tuan']; // 团队奖励比例
        
        $k = 0;

        do {
            // 查询上级的上级
            $parent = Db::name('user')->where('id', $sid)->find();
            // // $i < 2 是直推 和 间推
            if($i <= 2){
                if($i == 1){
                    // 给直推上级分佣 direct
                    // 计算直推奖励 保留2位小数
                    $direct_profit = round($profit * $config['direct'] / 100, 2);
                    // 给直推上级分佣
                    userRecord($parent['id'], $direct_profit, 1, 0, '直推奖励:'. $direct_profit. '金牌,任务包来自用户ID:'. $uid);
                }else{
                    // 给间推上级分佣 indirect
                    // 计算间推奖励 保留2位小数
                    $indirect_profit = round($profit * $config['indirect'] / 100, 2);
                    // 给间推上级分佣
                    userRecord($parent['id'], $indirect_profit, 1, 0, '间推奖励:'. $indirect_profit. '金牌,任务包来自用户ID:'. $uid);
                }
            }else{
                // ================== 2级以外的分销 =========================== 最高10级
                // 判断是否为0撸用户 查询闪卡使用中并且未到期 0撸用户不参3代以为的分销
                // 查询用户的闪卡情况
                $flash_card = Db::name('user_card_record')->where('uid', $uid)->where('is_status', 1)->where('del', '=', 0)->find();
                // $flash_card = 1;测试使用
                // 闪卡存在并且未到期
                if($flash_card){
                    // 在查看用户的足球数量
                    $football = Db::name('ball_user')->where('uid', $uid)->where('is_status', 0)->count();
                    // $football = $parent['football']; // 测试使用
                    /**
                     * 由于业务逻辑特殊 5级 和 9级 的足球数量需要加 1
                     */
                    $football_num = 0;
                    if($i == 6 || $i == 10){
                        $football_num = 1;
                    }
                     // 3,4,6,7,8,10级 足球数量条件不加 1
                    if($football >= $tuan[$k - $football_num]['generation']){
                        // 计算奖励 保留2位小数
                        $generation_profit = round($profit * $tuan[$k - $football_num]['ratio'] / 100, 2);
                        // 给上级分佣
                        userRecord($parent['id'], $generation_profit, 1, 0, '第'. $i . '代奖励:'. $generation_profit. '金牌,任务包来自用户ID:'. $uid);
                    }
                    if($football_num == 0){
                        $k++;
                    }
                }
            }

            // 给sid 分配最新上级
            $i++;
            $sid = $parent['sid'];
        }while($sid > 0 && $i < 11); // 最高10级 $i小于11 就是10级
    }
}